package br.fatec.ads.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import br.fatec.ads.connection.DataSource;
import br.fatec.ads.exception.DataBaseException;
import br.fatec.ads.exception.ProcessoSeletivoException;
import br.fatec.ads.model.Cliente;
import br.fatec.ads.model.ProcessoSeletivo;

public class ProcessoSeletivoDAO {
	private static ProcessoSeletivoDAO processoSeletivoDAO;
	private static String INCLUIR_PROCESSO_SELETIVO = "EXEC P_PROCESSO_SELETIVO_INCLUIR ?, ?, ?, ?, ?";
	private static String ALTERAR_PROCESSO_SELETIVO = "EXEC P_PROCESSO_SELETIVO_ALTERAR ?, ?, ?, ?, ?";
	private static String EXCLUIR_PROCESSO_SELETIVO = "EXEC P_PROCESSO_SELETIVO_EXCLUIR ?, ?";
	private static String CONSULTAR_PROCESSO_SELETIVO = "EXEC P_PROCESSO_SELETIVO_CONSULTAR ?";
	private static String LISTAR_PROCESSO_SELETIVO = "EXEC P_PROCESSO_SELETIVO_LISTAR ?, ?";
	
	SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
	
	public ProcessoSeletivoDAO() {
		super();
	}
	
	public static ProcessoSeletivoDAO getInstance(){
		if(processoSeletivoDAO == null){
			processoSeletivoDAO = new ProcessoSeletivoDAO();
		}
		
		return processoSeletivoDAO;
	}
	
	public void incluirProcessoSeletivo(ProcessoSeletivo processoSeletivo) throws ProcessoSeletivoException, DataBaseException{
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(INCLUIR_PROCESSO_SELETIVO);

                int i = 0;
                query.setInt(++i, processoSeletivo.getCliente().getIdCliente());
                query.setString(++i, processoSeletivo.getNomeProcessoSeletivo());
                query.setString(++i, processoSeletivo.getDescProcessoSeletivo());
                query.setDate(++i, (Date) processoSeletivo.getDataProva());
                query.setString(++i, processoSeletivo.getUsuario());
                
                query.executeUpdate();
            }catch(SQLException cause){
                throw new ProcessoSeletivoException("Problemas ao INSERIR o Processo Seletivo!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        } catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
	
	public void alterarProcessoSeletivo(ProcessoSeletivo processoSeletivo) throws ProcessoSeletivoException, DataBaseException {
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(ALTERAR_PROCESSO_SELETIVO);

                int i = 0;
                query.setInt(++i, processoSeletivo.getIdProcessoSeletivo());
                query.setString(++i, processoSeletivo.getNomeProcessoSeletivo());
                query.setString(++i, processoSeletivo.getDescProcessoSeletivo());
                query.setDate(++i, (Date) processoSeletivo.getDataProva());
                query.setString(++i, processoSeletivo.getUsuario());

                query.executeUpdate();
            }catch(SQLException cause){
                throw new ProcessoSeletivoException("Problemas ao ALTERAR o Processo Seletivo!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        }catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
	
	public void excluirProcessoSeletivo(ProcessoSeletivo processoSeletivo) throws ProcessoSeletivoException, DataBaseException{
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(EXCLUIR_PROCESSO_SELETIVO);

                int i = 0;
                query.setInt(++i, processoSeletivo.getIdProcessoSeletivo());
                query.setString(++i, processoSeletivo.getUsuario());

                query.executeUpdate();
            }catch(SQLException cause){
                throw new ProcessoSeletivoException("Problemas ao EXCLUIR o Processo Seletivo!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        }catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
	
	public ProcessoSeletivo getProcessoSeletivo(int idProcessoSeletivo) throws ProcessoSeletivoException, DataBaseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	ProcessoSeletivo processoSeletivo = null;
    	Cliente cliente = null;
    	
    	try{
    		try{
    			processoSeletivo = new ProcessoSeletivo();
    			
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(CONSULTAR_PROCESSO_SELETIVO);
    			
    			int i = 0;
    			query.setInt(++i, idProcessoSeletivo);
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				cliente = new Cliente();
    				
    				cliente.setIdCliente(resultSet.getInt("IDCLIENTE"));
    				cliente.setNomeCliente(resultSet.getString("CLI_NMCLIENTE"));
    				
    				processoSeletivo.setCliente(cliente);
    				processoSeletivo.setIdProcessoSeletivo(resultSet.getInt("IDPROCESSOSELETIVO"));
    				processoSeletivo.setNomeProcessoSeletivo(resultSet.getString("NOMEPROCESSOSELETIVO"));
    				processoSeletivo.setDescProcessoSeletivo(resultSet.getString("DESCPROCESSOSELETIVO"));
    				processoSeletivo.setDataProva(resultSet.getDate("DATAPROVA"));
    				processoSeletivo.setDataProvaString(formatador.format(resultSet.getDate("DATAPROVA")));
    				processoSeletivo.setAtivo(resultSet.getString("ATIVO"));
    				processoSeletivo.setDataHora(resultSet.getTimestamp("DTHRINCLUSAO"));
    				processoSeletivo.setUsuario(resultSet.getString("USUARIOINCLUSAO"));
    			}
    		}catch (SQLException cause) {
    			throw new ProcessoSeletivoException("Problemas ao CONSULTAR o Processo Seletivo!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	
    	return processoSeletivo;
    }
	
	public List listarProcessoSeletivo(Date dataDe, Date dataAte) throws ProcessoSeletivoException, DataBaseException, ParseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	List listaProcessoSeletivo = new ArrayList();
    	
    	try{
    		try{
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(LISTAR_PROCESSO_SELETIVO);
    			
    			int i = 0;
    			query.setDate(++i, dataDe);
    			query.setDate(++i, dataAte);
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				ProcessoSeletivo processoSelet = new ProcessoSeletivo();
    				
    				processoSelet.setIdProcessoSeletivo(resultSet.getInt("IDPROCESSOSELETIVO"));
    				processoSelet.setNomeProcessoSeletivo(resultSet.getString("NOMEPROCESSOSELETIVO"));
    				processoSelet.setDescProcessoSeletivo(resultSet.getString("DESCPROCESSOSELETIVO"));
    				processoSelet.setDataProva(resultSet.getDate("DATAPROVA"));
    				processoSelet.setDataProvaString(formatador.format(resultSet.getDate("DATAPROVA")));
    				processoSelet.setAtivo(resultSet.getString("ATIVO"));
    				processoSelet.setDataHora(resultSet.getTimestamp("DTHRINCLUSAO"));
    				processoSelet.setUsuario(resultSet.getString("USUARIOINCLUSAO"));
    				
    				listaProcessoSeletivo.add(processoSelet);
    			}
    		}catch (SQLException cause) {
    			throw new ProcessoSeletivoException("Problemas ao LISTAR o Processo Seletivo!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	
    	return listaProcessoSeletivo;
    }
}